#pragma once

#include "Object.h"
#include "Type.h"

/**
 * Number 数字对象
 *
 * union _NumberBond number:
 * 存储浮点数或者整数的联合体，省内存。
 * 关于 decimal_t 和 int_max 的定义，见 "Type.h"
 *
 * double multiple_digit:
 * 仅在载入小数时有用。详情见 number_pull ()
 *
 * NType type:
 * 数字类的类型，用于区分浮点和整数。
 */
OBJECT_DECLARE (Number, number)
#define NUMBER(any_obj) ((Number*)(any_obj))
struct _Number
{
        Object parent_instance;
        union _NumberBond
        {
                decimal_t f;
                int_max   l;
        } number;

        double multiple_digit;

        NType  type;
};

/**
 * @brief 拷贝一个数字对象到另一个当中。
 *
 * @param obj 本对象
 * @param dest_obj 目标对象
 */
void number_copy_to (Number* obj, Number* dest_obj);

/**
 * @brief 改变数字对象的类型。
 *
 * @param obj 本对象
 * @param type 数字类型
 */
void number_change_type (Number* obj, NType type);

/**
 * @brief 向数字对象新添一个数字，如向 123 添加 4 之后变为 1234；
 * 12.3 添加 4 后变为 12.34
 *
 * @param obj 本对象
 * @param num 需要添加的数字，在 0 - 9 之间
 */
void number_pull (Number* obj, uint8 num);